package com.tanhua.server.service;

import com.alibaba.fastjson.JSON;
import com.tanhua.autoconfig.template.FaceTemplate;
import com.tanhua.autoconfig.template.OssTemplate;
import com.tanhua.commons.exception.TanHuaException;
import com.tanhua.dubbo.api.db.UserInfoApi;
import com.tanhua.model.db.User;
import com.tanhua.model.db.UserInfo;
import com.tanhua.model.vo.ErrorResult;
import com.tanhua.model.vo.UserInfoVo;
import com.tanhua.server.interceptor.UserHolder;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.joda.time.DateTime;
import org.joda.time.Years;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 用户注册-完善个人（保存用户信息、上传头像）-业务实现类
 */
@Service
@Slf4j
public class UserInfoService {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @DubboReference
    private UserInfoApi userInfoApi;

    @Autowired
    private FaceTemplate faceTemplate;

    @Autowired
    private OssTemplate ossTemplate;

    /**
     * 第二步：用户注册：保存用户信息
     * @param userInfoVo
     */
    public void loginReginfo(UserInfoVo userInfoVo) {
        //3.如果登录，则调用服务提供者 保存用户信息
        UserInfo userInfo = new UserInfo();
        //将相同属性 相同类型 的数据从一个对象 copy 另一个对象中
        BeanUtils.copyProperties(userInfoVo,userInfo);
        userInfo.setId(UserHolder.getUserId()); //当前登录用户id 跟 tb_userInfo表 一对一
        userInfo.setAge(getAge(userInfoVo.getBirthday()));//设置年龄
        userInfoApi.add(userInfo);
    }

    /**
     * 根据请求头中token获取user对象
     * @param token
     * @return
     */
    /*private User getLoginUserByToken(String token) {
        String tokenKey = "TOKEN_" + token;
        String userStr = stringRedisTemplate.opsForValue().get(tokenKey);
        //2.如果没有登录 抛出异常
        if(StringUtils.isEmpty(userStr)){
            throw new TanHuaException(ErrorResult.loginFail());
        }
        //2.1 根据userStr 转user对象 并获取用户id
        return JSON.parseObject(userStr, User.class);
    }*/


    /**
     * 通过年-月-日获取年龄
     * @param yearMonthDay
     * @return
     */
    private int getAge(String yearMonthDay){
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date birthDay = sdf.parse(yearMonthDay);
            Years years = Years.yearsBetween(new DateTime(birthDay), DateTime.now());
            return years.getYears();
        } catch (ParseException e) {
            log.error("获取用户年龄失败!", e);
            return 0;
        }
    }

    /**
     * 第三步：用户注册：上传头像
     */
    public void loginHeadReginfo(MultipartFile headPhoto) {
        try {
            //2.调用百度人脸识别
            boolean faceFlag = faceTemplate.detect(headPhoto.getBytes());
            if(!faceFlag){
                throw new TanHuaException(ErrorResult.faceError());
            }
            //3.调用阿里云oss
            String filename = headPhoto.getOriginalFilename();//原始文件名称
            String headUrl = ossTemplate.upload(filename, headPhoto.getInputStream()); //调用阿里云服务 返回头像地址
            //4.调用服务提供者 更新头像地址
            UserInfo userInfo = new UserInfo();
            userInfo.setId(UserHolder.getUserId());//当前用户id
            userInfo.setAvatar(headUrl);//头像地址
            userInfoApi.update(userInfo);
        } catch (IOException e) {
            e.printStackTrace();
            throw new TanHuaException(ErrorResult.error());
        }
    }

    /**
     * 用户信息管理-查询用户资料
     */
    public UserInfoVo getUserInfo(Long userID) {
        //1.获取userId
        Long userId = UserHolder.getUserId();
        //2.调用服务提供者 查询用户资料
        if(userID != null){
            userId = userID;
        }
        UserInfo userInfo = userInfoApi.getUserInfo(userId);
        //3.构造UserInfoVo返回
        UserInfoVo userInfoVo = new UserInfoVo();
        BeanUtils.copyProperties(userInfo,userInfoVo);
        userInfoVo.setId(userId);//设置用户id
        return userInfoVo;
    }

    /**
     * 用户信息管理-更新用户资料
     */
    public void updateUserInfo(UserInfoVo userInfoVo) {
        //2.调用服务提供者 更新用户资料
        UserInfo userInfo = new UserInfo();
        BeanUtils.copyProperties(userInfoVo,userInfo);
        userInfo.setId(UserHolder.getUserId());//设置当前用户id 需要根据id更新用户信息
        userInfo.setAge(getAge(userInfoVo.getBirthday()));
        userInfoApi.update(userInfo);
    }
}
